package com.googlecode.gwt.crypto.bouncycastle.generators;

import com.googlecode.gwt.crypto.bouncycastle.KeyGenerationParameters;
import com.googlecode.gwt.crypto.bouncycastle.params.DESedeParameters;


//import org.bouncycastle.crypto.KeyGenerationParameters;
//import org.bouncycastle.crypto.params.DESedeParameters;

public class DESedeKeyGenerator extends DESKeyGenerator {
	/**
	 * initialise the key generator - if strength is set to zero the key
	 * generated will be 192 bits in size, otherwise strength can be 128 or 192
	 * (or 112 or 168 if you don't count parity bits), depending on whether you
	 * wish to do 2-key or 3-key triple DES.
	 * 
	 * @param param
	 *            the parameters to be used for key generation
	 */
	public void init(KeyGenerationParameters param) {
		super.init(param);

		if (strength == 0 || strength == (168 / 8)) {
			strength = DESedeParameters.DES_EDE_KEY_LENGTH;
		} else if (strength == (112 / 8)) {
			strength = 2 * DESedeParameters.DES_KEY_LENGTH;
		} else if (strength != DESedeParameters.DES_EDE_KEY_LENGTH
				&& strength != (2 * DESedeParameters.DES_KEY_LENGTH)) {
			throw new IllegalArgumentException("DESede key must be "
					+ (DESedeParameters.DES_EDE_KEY_LENGTH * 8) + " or "
					+ (2 * 8 * DESedeParameters.DES_KEY_LENGTH) + " bits long.");
		}
	}

	public byte[] generateKey() {
		byte[] newKey = new byte[strength];

		do {
			random.nextBytes(newKey);

			DESedeParameters.setOddParity(newKey);
		} while (DESedeParameters.isWeakKey(newKey, 0, newKey.length));

		return newKey;
	}
}
